home *** CD-ROM | disk | FTP | other *** search
- // MyVUMeterPeriodical.cpp
- // Gregory Lo
- // 22 June 2000 (MacHack 2000)
-
-
- #include "MyVUMeterPeriodical.h"
- #include <Sound.h>
- #include <Events.h>
- #include <DrawSprocket.h>
-
- #include <LPeriodical.h>
-
-
- MyVUMeterPeriodical::MyVUMeterPeriodical( void )
- : mIntensity(kVUMeterMaxIntensity),
- mDstIntensity(0),
- mLastUpdateTime(0),
- mVelocity(kVUMeterVelocityDown)
- {
- ::DSpStartup();
-
- OSErr err = noErr;
- //Open the sound input device
- err = ::SPBOpenDevice( nil, siWritePermission, &mSIRefNum );
-
- short meterState = 1;
- err = ::SPBSetDeviceInfo( mSIRefNum, siLevelMeterOnOff, (Ptr)&meterState );
-
- ::HideCursor();
- }
-
- MyVUMeterPeriodical::~MyVUMeterPeriodical( void )
- {
- Reset();
- ::DSpShutdown();
-
- //We're done so close the device
- OSErr err = ::SPBCloseDevice( mSIRefNum );
-
- ::InitCursor();
- }
-
- void
- MyVUMeterPeriodical::SpendTime( const EventRecord& inMacEvent )
- {
- switch ( inMacEvent.what )
- {
- case keyDown:
- {
- PulseTo();
- break;
- }
-
- case autoKey:
- {
- mVelocity = kVUMeterVelocityUp;
- break;
- }
-
- default:
- {
- {
- static bool sbCursorIsHidden = true;
-
- if ( LCommander::GetTarget() == nil && sbCursorIsHidden )
- {
- ::ShowCursor();
- sbCursorIsHidden = false;
- }
- else if ( LCommander::GetTarget() != nil && !sbCursorIsHidden )
- {
- ::HideCursor();
- sbCursorIsHidden = true;
- }
- }
-
- UInt32 now = ::TickCount();
-
- if ( now > mLastUpdateTime + kkVUMeterDelay )
- {
- struct soundLevelData {
- short meterState;
- short meterSetting;
- } theInfo;
-
- OSErr err = ::SPBGetDeviceInfo( mSIRefNum, siLevelMeterOnOff, (Ptr)&theInfo );
-
- if ( theInfo.meterSetting > 0 )
- {
- SInt32 level = ( theInfo.meterSetting * 100 ) / 255;
- PulseTo( (level<6) ? level+5 : level );
- }
-
- mLastUpdateTime = now;
-
- mIntensity += mVelocity;
-
- if ( mIntensity > mDstIntensity )
- {
- mIntensity = mDstIntensity;
- mVelocity = -kVUMeterVelocityDown;
- }
- else if ( mIntensity < kVUMeterMinIntensity )
- {
- mIntensity = kVUMeterMinIntensity;
- }
-
- OSStatus status = ::DSpContext_FadeGamma( 0, mIntensity, 0 );
- }
- break;
- }
- }
- }
-
- void
- MyVUMeterPeriodical::Pulse( SInt32 inPulse )
- {
- mDstIntensity = kVUMeterMaxIntensity;
- mVelocity = inPulse;
- }
-
- void
- MyVUMeterPeriodical::PulseTo( SInt32 inPulseTo )
- {
- if ( mDstIntensity < inPulseTo || mVelocity < 0 )
- {
- mDstIntensity = inPulseTo;
- mVelocity = kVUMeterPulse;
- }
- }
-
- void
- MyVUMeterPeriodical::Reset( void )
- {
- OSStatus status = ::DSpContext_FadeGamma( 0, 100, 0 );
- }
-
- void
- MyVUMeterPeriodical::Toggle( void )
- {
- if ( IsRepeating() )
- {
- StopRepeating();
- Reset();
- }
- else
- {
- StartRepeating();
- }
- }
-
- MyVUMeterPeriodical&
- MyVUMeterPeriodical::Instance( void )
- {
- static MyVUMeterPeriodical sInstance;
- return sInstance;
- }
-
-
-